﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;
using LiveatEdu.dao;
using LiveatEdu.model;
using System.Security;

namespace LiveatEdu
{
    class ConsoleLiveEdu
    {
        public static ConnectionTXT logFile;

        static void Main(string[] args)
        {      
            //gerar a data atual para ler o arquivo
            ConfigFile config = new ConfigFile();

            string ActualDate = DateTime.Today.ToString("_yyyy_MM_dd");

            #region campos com os nomes de todos os arquivos que estão local no sistema
            string localPathXML = config.LocalPath;
            string localStudentXMLpath = localPathXML + "alunos" + ActualDate + ".xml";
            string localDiscipline_Teacher_LessionXMLPath = localPathXML + "grupo_professor_curso" + ActualDate + ".xml";
            string localDisciplineXMLPath = localPathXML + "disciplinas" + ActualDate + ".xml";
            string localProf_discXMLPath = localPathXML + "profe_disc" + ActualDate + ".xml";
            string localProfessoresXMLPath = localPathXML + "professores" + ActualDate + ".xml";
            #endregion

            #region campos com os nomes de todos os arquivos que estão no FTP
            string alunosXMLpath = "alunos" + ActualDate + ".xml";
            string grupo_professor_cursoXMLPath = "grupo_professor_curso" + ActualDate + ".xml";
            string disciplinasXMLPath = "disciplinas" + ActualDate + ".xml";
            string prof_discXMLPath = "profe_disc" + ActualDate + ".xml";
            #endregion            

            //cria o arquivo de log atual
            string fileToLog = "LiveatdEuLog";
            logFile = new ConnectionTXT(localPathXML, fileToLog, ActualDate);
            logFile.AddMSgHeader();

            #region abre conexão com o FTP e salva em disco os arquivos com os dados
            logFile.AddMSgError("==========ABERTURA DO FTP=============================================================");
            logFile.AddMSgStartBlock();    
            /*
            string ftpAddress = "ftp://madareth.digiprimus.com.br/";
            string userName = "facet-ad";
            string passwordFTP = "KD3P71J4058y259";
            ConnectionFTP FTPconn = new ConnectionFTP();
            string file = FTPconn.GetFile(new Uri(ftpAddress+alunosXMLpath),userName,passwordFTP);
            //File.Create(localAlunosXMLpath);
            //File.WriteAllText(localPathXML, file);
            */         
            logFile.AddMSgEndBlock();
            logFile.AddMSgError("==========FECHAMENTO DO FTP===========================================================");
            #endregion

            #region le o xml dos alunos
            logFile.AddMSgError("==========ABERTURA ARQUIVOS XML=======================================================");
            logFile.AddMSgStartBlock();    
            List<Student> alunosXML = new List<Student>();
            List<Lession> cursoAlunoXML = new List<Lession>();
            ConnectionXML usuarioXML = new ConnectionXML();
            if (usuarioXML.openDocument(localStudentXMLpath))
            {
                //realiza o processamento do xml dos alunos
                alunosXML     = usuarioXML.ReadStudent();
                cursoAlunoXML = usuarioXML.ReadClass();
            }
            #endregion

            #region le o xml dos professores
            List<Teacher> profXML = new List<Teacher>();
            ConnectionXML profeXML = new ConnectionXML();
            if (profeXML.openDocument(localProfessoresXMLPath))
            {
                //realiza o processamento do xml dos alunos
                profXML = profeXML.ReadTeacher();
            }
            #endregion

            #region le o xml dos grupos de curso dos professores
            List<Lession> profGrupoXML = new List<Lession>();
            ConnectionXML profeGrupoXML = new ConnectionXML();
            if (profeGrupoXML.openDocument(localDiscipline_Teacher_LessionXMLPath))
            {
                //realiza o processamento do xml dos alunos
                profGrupoXML = profeGrupoXML.ReadTeacherGroup();
            }
            #endregion

            #region le o xml com os grupos de disciplinas
            List<Group> groupXML = new List<Group>();
            ConnectionXML groupsXML = new ConnectionXML();
            if (groupsXML.openDocument(localProf_discXMLPath))
            {
                //realiza o processamento do xml dos alunos
                groupXML = groupsXML.ReadGroup();
            }
            #endregion

            #region le o xml com as disciplinas que os alunos estão matriculados
            List<Lession> lessionXML = new List<Lession>();
            ConnectionXML lessionsXML = new ConnectionXML();
            if (lessionsXML.openDocument(localDisciplineXMLPath))
            {
                //realiza o processamento do xml dos alunos
                lessionXML = lessionsXML.ReadLession();
            }
            logFile.AddMSgEndBlock();
            logFile.AddMSgError("==========FECHAMENTO DOS ARQUIVOS XML=================================================");    
            #endregion

            #region Gera o Runspace no servidor do outlook live
            string username = "administrador@facet.edu.br";
            string passwordOL = "facet@123";
            SecureString secureString = new SecureString(); ;
            foreach (char c in passwordOL)
            {
                secureString.AppendChar(c);
            }
            ConnectionPS ps = new ConnectionPS(username,secureString);
            #endregion

            #region busca os dados de mailbox no Outlook Live e compara com os dados dos XML
            List<String> mailAccountOnLive = new List<String>();
            mailAccountOnLive = ps.GetAllMailbox();
            List<Person> newMailBox = new List<Person>();
            bool status = true;        
            for (int  i = 0; i < alunosXML.Count; i++)
            {
                for (int j = 0; j < mailAccountOnLive.Count; j++)
                {
                    status = true;
                    if (mailAccountOnLive[j] == alunosXML[i].Mail)
                    {
                        status = false;
                        break;
                    }                    
                }
                if (status)
                {
                    newMailBox.Add(alunosXML[i]);
                    status = false;
                }
            }
            for (int i = 0; i < profXML.Count; i++)
            {
                for (int j = 0; j < mailAccountOnLive.Count; j++)
                {
                    status = true;
                    if (mailAccountOnLive[j] == profXML[i].Mail)
                    {
                        status = false;
                        break;
                    }
                }
                if (status)
                {
                    newMailBox.Add(profXML[i]);
                    status = false;
                }
            }
            #endregion

            #region busca os dados de DistributionGroup e compara com os dados dos XML
            List<String> distributionGroupAccountOnLive = new List<String>();
            distributionGroupAccountOnLive = ps.GetAllDistributionGroup();
            List<Group> newDistributionGroup = new List<Group>();
            status = true;
            for (int i = 0; i < groupXML.Count; i++)
            {
                for (int j = 0; j < distributionGroupAccountOnLive.Count; j++)
                {
                    status = true;
                    if (distributionGroupAccountOnLive[j] == groupXML[i].PrimaySmtpAddress)
                    {
                        status = false;
                        break;
                    }
                }
                if (status)
                {
                    newDistributionGroup.Add(groupXML[i]);
                    status = false;
                }
            }            
            #endregion

            #region cadastra as mailbox e remove a capacidade de POP3 delas
            //gera as mailbox
            logFile.AddMSgError("==========CADASTRO DE USUÁRIOS========================================================");
            logFile.AddMSgStartBlock();
            for (int i = 0; i < newMailBox.Count; i++)
            {
                ps.CreatePerson(newMailBox[i]);
            }
            logFile.AddMSgEndBlock();
            logFile.AddMSgError("==========FIM CADASTRO USUÁRIOS=======================================================");

            //desabilita POP das mailbox dos alunos
            for (int i = 0; i < alunosXML.Count; i++)
            {
                ps.DisablePOP(alunosXML[i]);
            }
            //desabilita POP das mailbox dos professores
            for (int i = 0; i < profXML.Count; i++)
            {
                ps.DisablePOP(profXML[i]);
            }
            #endregion
            
            #region gera estrutura dos grupos de distribuição
            //gera os grupos de distribuição
            logFile.AddMSgError("==========CADASTRO GRUPOS DISCIPLINAS=================================================");
            logFile.AddMSgStartBlock();
            for (int i = 0; i < newDistributionGroup.Count; i++)
            {
                ps.CreateGroup(newDistributionGroup[i]);
            }
            logFile.AddMSgEndBlock();
            logFile.AddMSgError("==========FIM CADASTRO GRUPOS DISCIPLINAS=============================================");
            //adiciona os alunos nas aulas
            for (int i = 0; i < lessionXML.Count; i++)
            {
                ps.AddUserDistributionGroup(lessionXML[i]);
            }             
            //adiciona os professoresnos grupos gerais
            for (int i = 0; i < profGrupoXML.Count; i++)
            {
                ps.AddUserDistributionGroup(profGrupoXML[i]);
            }
            //adiciona alunos nos grupos gerais
            for (int i = 0; i < cursoAlunoXML.Count; i++)
            {
                ps.AddUserDistributionGroup(cursoAlunoXML[i]);
            }
            #endregion
            
            //finaliza a conexão com o runspace
            ps.Close();
            logFile.Close();
            
        }
    }
}